package com.kaka;

import java.util.InputMismatchException;
import java.util.Scanner;

/**
 * @program: java_base
 * @className: com.kaka.Test2
 * @description: 万年历
 * 1、输入一个4位的年，获取年份
 * 2.处理异常 输入格式错误的异常
 * 3、输入错误可以继续输入
 * 4、处理不合理的数据，不符合程序要求的数据
 * 5、打印一年日历
 * 6、确定每个月的具体天数 确定哪些月份是30天，哪些是31天 特殊情况2月，和年份有关
 * 7、 计算1号是周几
 * 8、在打印1号的确定需要有几个空白
 * @author: 513 王老师(qq:292817678,tel&微信:18688753763)
 * @create: 2020-09-15 14:13
 **/
public class Test2 {
    public static void main(String[] args) {
        // 获取一个4位的年
        int year = getYear();
        System.out.println("显示日历的年份是：" + year);
        // 打印一年的日历
        printCalendar(year);
    }

    /**
     * 打印该年的日历
     * @param year
     */
    private static void printCalendar(int year) {
        for (int month = 1; month <= 12; month ++){
            System.out.println("当前是：" + month + " 月");
            System.out.println("一\t二\t三\t四\t五\t六\t日");
            PrintMonthOfDay(year,month);
            //每个月换行
            System.out.println();
        }
    }

    /**
     * 打印每一天
     * @param year
     * @param month
     */
    private static void PrintMonthOfDay(int year, int month) {
        int weekday = getWeekDay(year,month);
        for(int day = 1; day <= getMonthDays(year,month); day ++){

            // 每次打印1号需要先打印空格
            if (day == 1){
                for (int t = 1; t <= weekday; t ++){
                    System.out.print("\t");
                }
            }

            System.out.print(day + "\t");
            if( (day + weekday)  % 7 == 0){
                System.out.println();
            }
        }
    }

    /**
     *
     * @param year
     * @param month
     * @return 返回的是给定月份具体天数
     */
    private static int getMonthDays(int year, int month) {
        int days = 31;
        if (month == 4 || month == 6 || month == 9 || month == 11){
            days = 30;
        } else if(month == 2){
            return isLeaf(year) ? 29 : 28;
        }
        return days;
    }

    /**
     *
     * @param year
     * @return 如果是闰年 返回true
     */
    private static boolean isLeaf(int year){
        if (year % 4 == 0 && year % 100 != 0){
            return true;
        } else if(year % 400 == 0){
            return true;
        }
        return false;
    }

    /**
     * 计算每个月的1号是周几  比如1902年2月  （1900的天数 + 1901年的天数 + 1902年1月的天数 ）/ 7
     * @param year
     * @param month
     * @return
     */
    private static int getWeekDay(int year,int month){
        int totals = 0;
        // 年的总天数
        for(int y = 1900; y < year; y ++){
            totals = totals + (isLeaf(y) ? 366 : 365);
        }
        // 月的总天数
        for(int m = 1; m < month; m ++){
            totals = totals + getMonthDays(year,m);
        }

        return totals % 7;
    }

    /***
     *
     * @return 年份
     */
    private static int getYear() {
        int year = 1900;//计算机计算时间从1900计算
        boolean flag = true;
        do {
            try {
                // 需要键盘输入
                System.out.println("请输入一个4位的年：比如2020：");
                Scanner input = new Scanner(System.in);
                year = input.nextInt();
                // 如何判断是一个四位的数字
                if(year < 1900 || year > 9999){
                    // 不符合程序需求的数据
                    System.out.println("输入不和要求");
                    continue;
                }
                // 输入正确跳出循环
                flag = false;
                //break;
            } catch (InputMismatchException e){
                System.out.println("输入格式错误，请输入四位的数字年份");
            }
        } while (flag);


        return year;
    }
}
